/*********************************************
 * @autheur : CHOLLET Clément                *
 * @date    : 01.04.2013                     *
 * @version : 1.0 - Création de la classe    *
 * @version : 1.1 - Ajout de la sérialisation
 * @version : 1.2 - Ajout de mutateurs
 *********************************************/

#ifndef LUMIERE_H
#define LUMIERE_H

/*********************************************************************
 * Importation de la bibliothèque QT relative aux primitives OPEN GL *
 *********************************************************************/
#include <QtOpenGL>

#include "boost/serialization/serialization.hpp"
#include <boost/serialization/export.hpp>

/***************************************************************************************************************
 * Classe représentant toutes les caractéristiques nécessaires à l'élaboration d'une lumière dans une scène 3D *
 ***************************************************************************************************************/
class Lumiere
{
//-----------------------------------------------------Constructeurs et destructeurs-----------------------------------------------------//
private:
    //Constructeur par défault pour la sérialisation
    Lumiere();

public:
    //Constructeur à un paramètre
    Lumiere(GLint numero);

    //Destructeur d'une instance de la classe
    ~Lumiere();

//-----------------------------------------------------Méthodes-----------------------------------------------------//
public:
    //Active la lumière
    void enable();
    //Désactive la lumière
    void disable();


//-----------------------------------------------------Accesseurs-----------------------------------------------------//
public:
    //On affecte le numero associée à l'attribut _numeroLumiere
    void setNomLumiere(GLint numeroLumiere);

    //On affecte une couleur Rouge, Verte, Bleue et un paramètre Alpha au tableau _couleurAmbiante
    void setCouleurAmbiante(GLfloat rouge, GLfloat vert, GLfloat bleu, GLfloat alpha);

    //On affecte une couleur Rouge, Verte, Bleue et un paramètre Alpha au tableau _couleurDiffuse
    void setCouleurDiffuse(GLfloat rouge, GLfloat vert, GLfloat bleu, GLfloat alpha);

    //On affecte une couleur Rouge, Verte, Bleue et un paramètre Alpha au tableau _couleurSpeculaire
    void setCouleurSpeculaire(GLfloat rouge, GLfloat vert, GLfloat bleu, GLfloat alpha);

    //On affecte une couleur Rouge, Verte, Bleue et un paramètre Alpha au tableau _couleurReflectionSpeculaire
    void setCouleurReflectionSpeculaire(GLfloat rouge, GLfloat vert, GLfloat bleu, GLfloat alpha);

    //On affecte les coordonnées x ,y ,z à l'attribut _position
    void setPositionLumiere(GLfloat x, GLfloat y, GLfloat z, GLfloat w);

    //On affecte les coordonnées x ,y ,z à l'attribut _direction
    void setDirection(GLfloat x, GLfloat y, GLfloat z);

    //On affecte la valeur concentrationSpot à l'attribut _concentrationSpot
    void setConcentrationSpot(GLfloat concentrationSpot);

    //On affecte la valeur rayonSpot à l'attribut _rayonSpot
    void setRayonSpot(GLfloat rayonSpot);

    //Accesseur sur actif
    bool estActif();

    //Accesseur sur la couleur ambiante
    QColor& getCouleurAmbiante();

    //Accesseur sur la couleur diffuse
    QColor& getCouleurDiffuse();

    //Accesseur sur la couleur spéculaire
    QColor& getCouleurSpeculaire();

    //Accesseur sur la couleur de réflexion spéculaire
    QColor& getCouleurReflexionSpeculaire();

    //Accesseur sur la position en x
    float getPosX();

    //Accesseur sur la position en y
    float getPosY();

    //Accesseur sur la position en z
    float getPosZ();

    //Accesseur sur la position en w
    float getPosW();

    //Mutateur sur la position en x
    void setPosX(GLfloat x);

    //Mutateur sur la position en y
    void setPosY(GLfloat y);

    //Mutateur sur la position en z
    void setPosZ(GLfloat z);

    //Mutateur sur la position en w
    void setPosW(GLfloat w);

//--------------------------------------------------Surcharge des opérateurs-----------------------------------------------------//
public:

//-----------------------------------------------------Attributs-----------------------------------------------------//
private:
    //Nom de la lumière
    GLint _numero;

    //Contient les valeurs RGBA de la composante ambiante de la lumière
    GLfloat _couleurAmbiante[4];

    //Contient les valeurs RGBA de la composante diffuse de la lumière
    GLfloat _couleurDiffuse[4];

    //Contient les valeurs RGBA de la composante spéculaire de la lumière
    GLfloat _couleurSpeculaire[4];

    //Variables pour la gestion de la composante spéculaire
    GLfloat _couleurReflectionSpeculaire[4];
    GLfloat _brillanceSpeculaire;

    //Coordonnées de la position de la lumière dans la scène 3D
    GLfloat _positionLumiere[4];

    //Coordonnées de la direction de la lumière (SPOTS)
    GLfloat _direction[3];

    //Variable pour la gestion des lumières en SPOT
    GLfloat _concentrationSpot;
    GLfloat _rayonSpot;

    //Variable indiquant si la lumiere est active
    bool _enable;

    //--------------------- Sérialisation ----------------------------------
private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version) {
            ar & _numero;
            ar & _couleurAmbiante;
            ar & _couleurDiffuse;
            ar & _couleurSpeculaire;
            ar & _couleurReflectionSpeculaire;
            ar & _brillanceSpeculaire;
            ar & _positionLumiere;
            ar & _direction;
            ar & _concentrationSpot;
            ar & _rayonSpot;
            ar & _enable;

            if(_enable)
            {
                enable();
            }
    }
   //----------------------------------------------------------------------
};

#endif // LUMIERE_H
